//package com.lbank.spiderflow;
//
//import com.lbank.market.huamao.selenium.config.properties.ChromeProperties;
//import com.lbank.market.huamao.selenium.driver.CustomChromeOptions;
//import com.lbank.market.huamao.selenium.utils.ChromeDriverUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.ObjectUtils;
//import org.openqa.selenium.By;
//import org.openqa.selenium.JavascriptExecutor;
//import org.openqa.selenium.TimeoutException;
//import org.openqa.selenium.WebElement;
//import org.openqa.selenium.chrome.ChromeDriver;
//import org.openqa.selenium.chrome.ChromeOptions;
//import org.openqa.selenium.support.ui.ExpectedConditions;
//import org.openqa.selenium.support.ui.WebDriverWait;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.net.URLDecoder;
//import java.nio.charset.StandardCharsets;
//import java.time.Duration;
//import java.util.Arrays;
//import java.util.Collections;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
//
///**
// * google爬取验证码
// *
// * @author zongchangbo
// * @date 2025/07/03
// */
//@Slf4j
//@Component
//public class GoogleICodeProcessor {
//
//    @Autowired
//    ChromeProperties chromeProperties;
//
//    /**
//     * 爬虫处理
//     *
//     * @param url
//     * @return
//     */
//    public String process(String url, String runFolder) {
//        return doSpider(url, runFolder);
//    }
//
//    private String doSpider(String url, String runFolder) {
//        ChromeDriver driver = doCreate(runFolder);
//        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15).getSeconds());
//        try {
//            driver.get(url);
//            // 拒绝Cookie提示 (如果出现)
//            refuseCookie(wait);
//
//            // 输入搜索词并提交
//            //inputKeyword(wait, keyword);
//
//            // 定位第一个赞助商广告并提取链接
//            String finalUrl = locateAndExtract(url, wait, driver);
//
//            // 解析出邀请码
//            String icode = extractIcode(finalUrl);
//            return icode;
//        } catch (Exception e) {
//            log.error("Google搜索邀请码爬取异常, url={}", url, e);
//        } finally {
//            if (driver != null) {
//                driver.close();
//                driver.quit();
//            }
//        }
//        return "error";
//    }
//
//    /**
//     * 定位第一个赞助商广告并提取链接
//     *
//     * @param wait
//     * @return
//     */
//    private static String locateAndExtract(WebDriverWait wait) {
//        // 定位第一个赞助商广告
//        WebElement firstAd = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div[data-text-ad='1']")));
//
//        // 提取广告链接 (处理Google重定向)
//        WebElement adLink = firstAd.findElement(By.cssSelector("a[data-pcu]"));
//        String redictUrl = firstAd.findElement(By.cssSelector("a")).getAttribute("href");
//        String href = adLink.getAttribute("href");
//        return href;
//    }
//
//    /**
//     * 定位第一个赞助商广告并提取链接
//     * @param url
//     * @param wait
//     * @param driver
//     * @return
//     * @throws InterruptedException
//     */
//    private static String locateAndExtract(String url, WebDriverWait wait, ChromeDriver driver) {
//        // 定位第一个赞助商广告
//         //WebElement firstAd = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div[data-text-ad='1']")));
//        // 使用快速检测机制（3秒超时）
//        WebElement firstAd = fastAdDetection(driver, 3);
//
//        if (firstAd == null) {
//            log.info("未定位到第一个赞助商广告, url={}", url);
//            return null;
//        }
//        // 获取广告链接元素
//        WebElement adLink = firstAd.findElement(By.cssSelector("a[data-pcu]"));
//
//        // 模拟点击获取最终URL
//        String originalWindow = driver.getWindowHandle();
//
//        // 在新标签页打开广告链接
//        ((JavascriptExecutor) driver).executeScript("window.open(arguments[0])",adLink.getAttribute("data-rw"));
//
//        // 切换到新标签页
//        wait.until(ExpectedConditions.numberOfWindowsToBe(2));
//        for (String window : driver.getWindowHandles()) {
//            if (!originalWindow.equals(window)) {
//                driver.switchTo().window(window);
//                break;
//            }
//        }
//
//        // 等待重定向完成（根据实际网络情况调整）
//        String finalUrl = driver.getCurrentUrl();
//        return finalUrl;
//    }
//
//    /**
//     * 快速广告检测（毫秒级响应）
//     * @param driver
//     * @param maxWaitSeconds
//     * @return
//     */
//    private static WebElement fastAdDetection(ChromeDriver driver, int maxWaitSeconds) {
//        // 方案1：直接DOM查询（最快）
//        List<WebElement> ads = driver.findElements(By.cssSelector("div[data-text-ad='1'], div[data-adw], div[role='listitem'][aria-label]"));
//        if (!ads.isEmpty()) return ads.get(0);
//
//        // 方案2：短时间等待（比默认15秒快5倍）
//        try {
//            return new WebDriverWait(driver, Duration.ofSeconds(maxWaitSeconds).getSeconds())
//                    .pollingEvery(Duration.ofMillis(100)) // 更频繁检查
//                    .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div[data-text-ad='1']")));
//        } catch (TimeoutException e) {
//            return null; // 超时立即返回空
//        }
//    }
//
//    /**
//     *  输入搜索词并提交
//     *
//     * @param wait
//     * @param keyword
//     */
//    private static void inputKeyword(WebDriverWait wait, String keyword) {
//        WebElement searchBox = wait.until(ExpectedConditions.presenceOfElementLocated(By.name("q")));
//        searchBox.sendKeys(keyword);
//        searchBox.submit();
//    }
//
//    /**
//     * 拒绝Cookie提示 (如果出现)
//     *
//     * @param wait
//     */
//    private static void refuseCookie(WebDriverWait wait) {
//        try {
//            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(., 'Tout refuser')]"))).click();
//        } catch (Exception e) {
//            System.out.println("未找到Cookie提示或已超时");
//        }
//    }
//
//    /**
//     * 解析查询字符串为 Map
//     * @param query
//     * @return
//     */
//    public static Map<String, String> splitQuery(String query) {
//        if (ObjectUtils.isEmpty(query)) {
//            return Collections.emptyMap();
//        }
//        return Arrays.stream(query.split("&"))
//                .map(param -> param.split("=", 2))
//                .filter(pair -> pair.length == 2)
//                .collect(Collectors.toMap(
//                        pair -> decode(pair[0]),
//                        pair -> decode(pair[1])
//                ));
//    }
//
//    /**
//     * URL 解码
//     * @param value
//     * @return
//     */
//    private static String decode(String value) {
//        try {
//            // 使用 UTF-8 编码进行解码
//            return URLDecoder.decode(value, StandardCharsets.UTF_8.name());
//        } catch (Exception e) {
//            // 捕获异常返回原始值
//            return value;
//        }
//    }
//
//    /**
//     * 取出icode参数值
//     * @param url
//     * @return
//     */
//    public static String extractIcode(String url) {
//        if (ObjectUtils.isEmpty(url)) return null;
//        try {
//            if (url.startsWith("https://www.lbank.com")) {
//                String lpurlQuery = url.substring(url.indexOf('?') + 1);
//                Map<String, String> innerParams = splitQuery(lpurlQuery);
//                // 返回icode的值
//                return innerParams.get("icode");
//            } else {
//                // 取问号后面的查询字符串部分
//                String query = url.substring(url.indexOf('?') + 1);
//
//                // 解析最外层URL的查询参数
//                Map<String, String> params = splitQuery(query);
//
//                // 从参数中取出 lpurl
//                String lpurl = params.get("lpurl");
//                if (lpurl == null) return null;
//
//                // lpurl是编码过的，再次解析其中的查询参数
//                String lpurlQuery = lpurl.substring(lpurl.indexOf('?') + 1);
//                Map<String, String> innerParams = splitQuery(lpurlQuery);
//
//                // 返回icode的值
//                return innerParams.get("icode");
//            }
//        } catch (Exception e) {
//            log.info("解析url验证码出现异常, url={}", url, e);
//            return null;
//        }
//    }
//
//    /**
//     * 创建驱动器
//     * @return
//     */
//    private ChromeDriver doCreate(String runFolder) {
//        System.setProperty("webdriver.chrome.driver", chromeProperties.getChromePath());
//        ChromeProperties properties = new ChromeProperties();
//        properties.setChromePath(chromeProperties.getChromePath());
//        properties.setRunFolder(chromeProperties.getRunFolder() + runFolder);
//        ChromeDriverUtils chromeDriverUtils = new ChromeDriverUtils(properties);
//        CustomChromeOptions customChromeOptions = chromeDriverUtils.defaultOptions();
//        customChromeOptions.setHeadless(true);
//
//        // 配置浏览器参数
//        ChromeOptions chromeOptions = customChromeOptions.getChromeOptions();
//        //chromeOptions.addArguments("--lang=" + langCode); // 设置语言环境
//        //chromeOptions.addArguments("--gl=" + countryCode); // 设置地区
//        chromeOptions.addArguments("--disable-blink-features=AutomationControlled");
//        chromeOptions.addArguments("--start-maximized");
//        chromeOptions.addArguments("--headless");
//        chromeOptions.addArguments("--no-sandbox");
//        return ChromeDriverUtils.create(customChromeOptions);
//    }
//
//}